
// 封装 Course 类，该类中用 name 字段表示课程名称
class Course{
    constructor(name){
        this.name = name ;
    }
}

// 封装 Score 类，该类中用 course 字段表示课程，用grade字段表示成绩
class Score {
    constructor(course,grade){
        this.course = course ;
        this.grade = grade ;
    }
}

// 封装 Student 类，该类中用scores字段表示当前学生所有的课程成绩
class Student {
    constructor( name ){
        this.name = name ;
        this.scores = [] ;
    }
    add( score ) {
        this.scores.push( score );
    }
}

// 封装 Class 类，该类中用students字段表示多个学生
class Class {
    constructor(){
        this.students = [] ;
    }
    add( stu ) {
        this.students.push(stu);
    }
    display(){
        // 遍历学生数组
        for( let i = 0 , n = this.students.length ; i < n ; i++ ){
            let stu = this.students[ i ];
            console.log( stu.name ); // 输出学生的姓名
            let scs = stu.scores ; // 取得该学生的所有成绩
            for( let j = 0 , m = scs.length ; j < m ; j++ ){
                let sc = scs[ j ];
                console.log( '\t' , sc.course.name , sc.grade );
            }
        }
    }
    sort(){
        for( let i = 0 , m = this.students.length - 1 ; i < m ; i++ ){
            for( let j = 0 ; j < m - i ; j++ ){

                let first = this.students[ j ] ;
                let second = this.students[ j + 1 ];

                let sum1 = 0 , sum2 = 0 ;

                // sum1 = first.scores[ 0 ].grade + first.scores[ 1 ].grade + first.scores[ 2 ].grade ;
                for( let x = 0 , n = first.scores.length ; x < n ; x++ ){
                    sum1 += first.scores[ x ].grade;
                }

                for( let x = 0 , n = first.scores.length ; x < n ; x++ ){
                    sum2 += second.scores[ x ].grade;
                }
                if( sum1 < sum2 ){
                    this.students[ j ]  = second ;
                    this.students[ j + 1 ] = first ;
                }

            }
        }
    }
}

const course1 = new Course( 'C++' );
const course2 = new Course( 'JavaScript' );
const course3 = new Course( 'English' );

// 创建班级
const c = new Class();

let s1 = new Student( '雷军' ); // 创建学生
// 创建成绩
let sc1 = new Score( course1 , 90 );
s1.add( sc1 ); // 为学生添加成绩

let sc2 = new Score( course2 , 89 );
s1.add( sc2 ); // 为学生添加成绩

let sc3 = new Score( course3 , 75 );
s1.add( sc3 ); // 为学生添加成绩

//  为班级添加学生
c.add( s1 );


let s2 = new Student( '马云' ); // 创建学生

sc1 = new Score( course1 , 59 ); // 创建成绩
s2.add( sc1 ); // 为学生添加成绩

sc2 = new Score( course2 , 40 ); // 创建成绩
s2.add( sc2 ); // 为学生添加成绩

sc3 = new Score( course3 , 100 ); // 创建成绩
s2.add( sc3 ); // 为学生添加成绩

c.add( s2 ); //  为班级添加学生

let s3 = new Student( '周鸿祎' ); // 创建学生

sc1 = new Score( course1 , 100 ); // 创建成绩
s3.add( sc1 ); // 为学生添加成绩

sc2 = new Score( course2 , 99 ); // 创建成绩
s3.add( sc2 ); // 为学生添加成绩

sc3 = new Score( course3 , 80 ); // 创建成绩
s3.add( sc3 ); // 为学生添加成绩

c.add( s3 ); //  为班级添加学生

c.display();
c.sort();
c.display();